package com.home.jinlanhua.utils;

import java.util.Calendar;
import java.util.Random;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by lzr on 2016-06-29.
 */
public class SerialUtil {

    public static void main(String[] args) throws Exception {
	}


    /**
     * 生成以type开头的字符串，如“O160629ABCD”
     * @param type
     * @return
     */
    public static String createOrderSerial(String type) {
        StringBuilder serial = new StringBuilder(type);
        Calendar calendar = Calendar.getInstance();
        String year = String.valueOf(calendar.get(Calendar.YEAR));
        // 取年份后2位
        serial.append(year.subSequence(2, 4));
        // 取月份 16进制表示 占用一位
        Integer month = calendar.get(Calendar.MONTH) + 1;
        if (month < 10) {
            serial.append("0").append(month);
        } else {
            serial.append(month);
        }
        // 日期
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        if (day < 10)
            serial.append("0").append(day);
        else
            serial.append(day);
        serial.append(getRandomCharAndNumr(4));
        return serial.toString();
    }

    /**
     * 获取随机字符串
     * @param length 字符串长度
     * @return
     */
    public static String getRandomCharAndNumr(Integer length) {
        String str = "";
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            boolean b = random.nextBoolean();
            if (b) { // 字符串
                // int choice = random.nextBoolean() ? 65 : 97; 取得65大写字母还是97小写字母
                str += (char) (65 + random.nextInt(26));// 取得大写字母
            } else { // 数字
                str += String.valueOf(random.nextInt(10));
            }
        }
        return str;
    }

	/**
	 * 获取随机数字
	 *
	 * @param length
	 * @return
	 */
	public static String getRandomNumber(Integer length) {
		String str = "";
		Random random = new Random();
		for (int i = 0; i < length; i++) {
			str += String.valueOf(random.nextInt(10));
		}
		return str;
	}

    
    /**
     * 传入一个StringBuffer并传出一个StingBuffer,去掉这个字符串缓冲区中所有传入的string
     * 
     * @param sb
     * @param string
     * @return
     */
    public static StringBuffer replace(StringBuffer sb, String string) {
    	int index = 0;
    	while(true) {
	    	index = sb.lastIndexOf(string);
	    	if (index == -1) {
	    		break;
	    	}
	    	sb.replace(index, index + string.length(), "");
    	}
    	return sb;
    }
	/**
	 * ean- 13 商品条码生成算法
	 * 
	 * @param code
	 * @return
	 */
	public static String eanCode(String code) {
		int c1 = 0;
		int c2 = 0;
		for (int i = 0; i < code.length(); i += 2) {
			char c = code.charAt(i);
			// 字符串code中第i个位置上的字符
			int n = c - '0';
			c1 += n;// 累加奇数位的数字和
		}
		for (int i = 1; i < code.length(); i += 2) {
			char c = code.charAt(i);// 字符串code中第i个位置上的字符
			int n = c - '0';
			c2 += n;// 累加偶数位的数字和
		}
		int cc = c1 + c2 * 3;
		int check = (10 - cc % 10) % 10;
		code += check + "";
		return code;
	}
	
	/**
	 * 将json对应对象对应值替换
	 * 
	 */
	public static String replace(String replaceFieldName, String baseString, String replaceFieldValue) {
		StringBuffer stringBuffer = new StringBuffer(baseString);
		String substring = baseString.substring(baseString.indexOf(replaceFieldName));
		char[] charArray = substring.toCharArray();
		int i = 0;
		int j = 0;
		int i2 = -1;
		int i3 = -1;
		for (char c : charArray) {
			if (c == 34) {
				i++;
			}
			if (i == 2 && i2 == -1) {
				i2 = j;
			}
			if (i == 3 && i3 == -1) {
				i3 = j;
			}
			j++;
		}
		stringBuffer.replace(i2 + baseString.indexOf(replaceFieldName) + 1, i3 + baseString.indexOf(replaceFieldName), replaceFieldValue);
		if (stringBuffer.substring(stringBuffer.indexOf(replaceFieldName) + 1).indexOf(replaceFieldName) != -1) {
			String recursion = stringBuffer.substring(0, stringBuffer.indexOf(replaceFieldName) + 1);
			String back = replace(replaceFieldName, stringBuffer.substring(stringBuffer.indexOf(replaceFieldName) + 1), replaceFieldValue);
			return recursion + back;
		}
		return stringBuffer.toString();
	}

	/**
	 * 创建一个云存储的url
	 * @param fileName
	 * @return
	 */
    public static String createPictureUrl(String fileName) {
		return Const.FILE_URL_HEAD + fileName;
    }

    public static String randomUId() {
    	 return UUID.randomUUID().toString().replaceAll("-","");
	}

    public static String randomUId(Integer length) {
    	StringBuffer forReturn = new StringBuffer(randomUId());

    	int i = length / forReturn.length();
    	if (i >= 1) {
			for (int j = 0; j < i ; j++) {
				forReturn.append(randomUId());
			}
		}
		return forReturn.substring(0, length);
	}

	/**
	 * 检查手机号的方法
	 */
	public static boolean checkCellPhone(String phone) {
		String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$";
		if (phone.length() != 11) {
			return false;
		} else {
			Pattern p = Pattern.compile(regex);
			Matcher m = p.matcher(phone);
			return m.matches();
		}
	}

	/**
	 * 检查身份证号
	 */
	public static boolean isIDNumber(String IDNumber) {
		if (IDNumber == null || "".equals(IDNumber)) {
			return false;
		}
		// 定义判别用户身份证号的正则表达式（15位或者18位，最后一位可以为字母）
		String regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" +
				"(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
		//假设18位身份证号码:41000119910101123X  410001 19910101 123X
		//^开头
		//[1-9] 第一位1-9中的一个      4
		//\\d{5} 五位数字           10001（前六位省市县地区）
		//(18|19|20)                19（现阶段可能取值范围18xx-20xx年）
		//\\d{2}                    91（年份）
		//((0[1-9])|(10|11|12))     01（月份）
		//(([0-2][1-9])|10|20|30|31)01（日期）
		//\\d{3} 三位数字            123（第十七位奇数代表男，偶数代表女）
		//[0-9Xx] 0123456789Xx其中的一个 X（第十八位为校验值）
		//$结尾

		//假设15位身份证号码:410001910101123  410001 910101 123
		//^开头
		//[1-9] 第一位1-9中的一个      4
		//\\d{5} 五位数字           10001（前六位省市县地区）
		//\\d{2}                    91（年份）
		//((0[1-9])|(10|11|12))     01（月份）
		//(([0-2][1-9])|10|20|30|31)01（日期）
		//\\d{3} 三位数字            123（第十五位奇数代表男，偶数代表女），15位身份证不含X
		//$结尾


		boolean matches = IDNumber.matches(regularExpression);

		//判断第18位校验值
		if (matches) {

			if (IDNumber.length() == 18) {
				try {
					char[] charArray = IDNumber.toCharArray();
					//前十七位加权因子
					int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
					//这是除以11后，可能产生的11位余数对应的验证码
					String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
					int sum = 0;
					for (int i = 0; i < idCardWi.length; i++) {
						int current = Integer.parseInt(String.valueOf(charArray[i]));
						int count = current * idCardWi[i];
						sum += count;
					}
					char idCardLast = charArray[17];
					int idCardMod = sum % 11;
					if (idCardY[idCardMod].toUpperCase().equals(String.valueOf(idCardLast).toUpperCase())) {
						return true;
					} else {
						return false;
					}

				} catch (Exception e) {
					e.printStackTrace();
					return false;
				}
			}

		}
		return matches;
	}


}
